package leetcode;

/**
 * 给定两个大小为 m 和 n 的有序数组 nums1 和 nums2。
 * <p>
 * 请你找出这两个有序数组的中位数，并且要求算法的时间复杂度为 O(log(m + n))。
 * <p>
 * 你可以假设 nums1 和 nums2 不会同时为空。
 * <p>
 * 示例 1:
 * <p>
 * nums1 = [1, 3]
 * nums2 = [2]
 * <p>
 * 则中位数是 2.0
 * 示例 2:
 * <p>
 * nums1 = [1, 2]
 * nums2 = [3, 4]
 * <p>
 * 则中位数是 (2 + 3)/2 = 2.5
 *
 * @author: cuihao
 * @create: 2020-05-05 22:07
 **/
public class FindMedianNum {
    public static void main(String[] args) {
        int[] m = {1, 2};
        int[] n = {3, 4};
        double d = findMedianNum(m, n);
        System.out.println(d);

    }

    public static double findMedianNum(int[] nums1, int[] nums2) {

        int[] sum = new int[nums1.length + nums2.length];

        int num = 0;
        int num1 = 0;
        int num2 = 0;

        while (num1 < nums1.length && num2 < nums2.length) {
            if (nums1[num1] < nums2[num2]) {
                sum[num++] = nums1[num1++];
            } else if (nums1[num1] == nums2[num2]) {
                sum[num++] = nums1[num1++];
                sum[num++] = nums2[num2++];
            } else {
                sum[num++] = nums2[num2++];
            }
        }

        while (num1 < nums1.length) {
            sum[num++] = nums1[num1++];
        }
        while (num2 < nums2.length) {
            sum[num++] = nums2[num2++];
        }

        if (num % 2 == 1) {
            return sum[num / 2];
        } else {
            double c = sum[num / 2 - 1];
            double b = sum[num / 2];
            return (b + c) / 2;
        }
    }
}

/**
 * 时间复杂度 m + n
 */
